package util.concurrent;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 生产者
 * 消费者
 */
public class Base1 {

    static List<String> cache = new LinkedList<>();

    public static void main(String[] args) {
        Base1 base = new Base1();

        new Thread(() -> base.give()).start();

        for (int i = 1; i <= 5; i++) {
            new Thread(() -> base.get()).start();
        }
    }

    /**
     * 生产者
     */
    void give() {
        try {
            while (!Thread.interrupted()) {//当前线程是否中断  中断  返回 true
                TimeUnit.SECONDS.sleep(2);
                synchronized (cache) {
                    if (cache.size() < 1) {
                        System.out.println("生产bread");
                        cache.add("bread");
                        cache.notify();//逻辑控制 了 生产者不会唤醒生产者
                    } else {
                        System.out.println("bread生产超过总量");
                        cache.wait();
                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 消费者
     */
    void get() {
        try {
            while (!Thread.interrupted()) {
                TimeUnit.SECONDS.sleep(2);
                synchronized (cache) {
                    if (cache.size() == 0) {
                        System.out.println("等待生产bread");
                        cache.wait();
                    } else {
                        System.out.println("消费bread");
                        cache.remove(0);
                        cache.notifyAll();
                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
